package com.aaa.backsystem.util;


import com.aaa.backsystem.entity.LayUiTree;
import com.aaa.backsystem.entity.Menu;
import com.aaa.backsystem.entity.TreeNode;

import java.util.ArrayList;
import java.util.List;

/**
 * fileName:TreeUtil
 * description:
 * author:gyc
 * createTime:2020/7/21 13:00
 * version:1.0.0
 */
public class TreeUtil {
    public static List<TreeNode> layerTree(List<TreeNode> treeNodes){
        //查询出所有节点的数据
        //List<TreeNode> treeNodes = powerDao.treeNodes();
        //实例化拼装数据
        List<TreeNode> tempTreeNode = new ArrayList<>();
        //判断集合防止空表
        if (treeNodes!=null&&treeNodes.size()>0){
            //循环查一级节点
            for (TreeNode treeNode : treeNodes) {
                if (treeNode.getPid()==0){
                    tempTreeNode.add(treeNode);
                    bindChildren(treeNode,treeNodes);
                }
            }
        }
        return tempTreeNode;
    }

    /**
     * 子节点的子节点
     * @param currentNode
     * @param treeNodes
     */
    public static void bindChildren(TreeNode currentNode, List<TreeNode> treeNodes){
        //循环查找子节点
        for (TreeNode treeNode : treeNodes) {
            //如果一个节点说当前节点的子节点
            if (treeNode.getPid().equals(currentNode.getId())){
                //获取当前节点的子节点集合
                List<TreeNode> children = currentNode.getChildren();
                if (children==null){//如果以前没有孩子，就要初始化孩子结合
                    children = new ArrayList<>();
                }
                children.add(treeNode); //添加当前节点到孩子集合
                currentNode.setChildren(children); //设置为孩子集合
                //每个孩子节点也可能有其他孩子，要重复绑定  递归
                bindChildren(treeNode,treeNodes);
            }
        }
    }


    /**
     * create by:
     * description:将List<Menu>换成 List<LayUiTree>
     * create time: 2020/7/17 15:32
     *
     * @return  List<LayUiTree>
     * @Param: menuList
     */
    public static List<LayUiTree> fromMenuListToTreeList(List<Menu> menuList){
        List<LayUiTree>   treeList = new ArrayList<>();
        //遍历所有的menu对象，然后发现menu对象有孩子，就继续便利孩子，递归操作
        for (Menu menu : menuList) {
            //如果父亲的id为0，就说明是一级目录
            if(menu.getParentId()==0){
                //将menu转成tree对象
                LayUiTree tree=fromMenuToTree(menu);
                //找自己的孩子,给tree对象设置孩子children
                LayUiTree treeChilren = setTreeChilren(tree, menuList);
                treeList.add(treeChilren);
            }
        }
        return treeList;
    }


    /**
     * create by:
     * description:找自己的孩子,给tree对象设置孩子children
     * create time: 2020/7/17 15:44
     *
     * @return a
     * @Param: null
     */
    public static LayUiTree setTreeChilren(LayUiTree tree, List<Menu> menuList){
        //此集合封装所有的孩子
        List<LayUiTree> children = new ArrayList<>();
        for (Menu menu : menuList) {
            //tree的id是他所有孩子的父亲id
            if(menu.getParentId()==tree.getId())
            {
                //将menu转成tree对象
                LayUiTree layUiTree=fromMenuToTree(menu);
                //递归设置自己的孩子
                children.add(setTreeChilren(layUiTree,menuList));
            }
        }
        tree.setChildren(children);
        return tree;
    }

    /**
     * create by:
     * description: 将menu转成tree对象
     * create time: 2020/7/17 15:55
     *
     * @return a
     * @Param: null
     */
    public static LayUiTree  fromMenuToTree(Menu menu){
        LayUiTree layUiTree = new LayUiTree();
        layUiTree.setId(menu.getMenuId());
        layUiTree.setTitle(menu.getMenuName());
        layUiTree.setUrl(menu.getUrl());
        return layUiTree;
    }
}
